#pragma once

#include "Common.h"
#include "ObjectPool.h"
#include "PageMap.h"

class PageCache
{
public:
//局唯一实例，通过 GetInstance() 获取，确保系统级内存页管理的统一性
	static PageCache* GetInstance()
	{
		return &_sInst;
	}

	// 获取从对象到span的映射
	Span* MapObjectToSpan(void* obj);

	// 释放空闲span回到Pagecache，并合并相邻的span
	void ReleaseSpanToPageCache(Span* span);

	//获取一个包含 k 个连续物理页的 Span
	Span* NewSpan(size_t k);

	std::mutex _pageMtx;

private:
	SpanList _spanLists[NPAGES];// 页的管理结构
	ObjectPool<Span> _spanPool;// 管理结构的对象池

	//1.基于哈希表（哈希桶）的无序映射
	//std::unordered_map<PAGE_ID, Span*> _idSpanMap;

	//2.基于红黑树（平衡二叉搜索树）的有序映射
	//std::map<PAGE_ID, Span*> _idSpanMap;

	//3.基于TCMalloc的映射
	//模板参数32 - PAGE_SHIFT：表示映射所需的 “索引位数”
	//具体优点见附录
	TCMalloc_PageMap1<32 - PAGE_SHIFT> _idSpanMap;

	PageCache()
	{}
	PageCache(const PageCache&) = delete;
	
	static PageCache _sInst;
};
